package service

import (
    "crypto/sha256"
    "encoding/hex"
    "fmt"
    "net/http"
    "strings"
    "time"
)

var (
    // 全局配置参数
    ClockSkewSeconds    int64 // 时钟偏移量(秒)
    TrustedClientToken string   // 受信客户端令牌
    WinEpoch           = 11644473600 // Windows文件时间纪元到Unix纪元的秒数差
    SToNs              = 1e9           // 秒到纳秒的转换系数
)

// AdjustClockSkew 调整全局时钟偏移量
func AdjustClockSkew(seconds int64) {
    ClockSkewSeconds += seconds
}

// GetUnixTimestamp 获取带时钟偏移的UTC Unix时间戳(秒)
func GetUnixTimestamp() int64 {
    return time.Now().In(time.UTC).Unix() + ClockSkewSeconds
}

// ParseRFC2616Date 解析RFC2616格式日期字符串为Unix时间戳
func ParseRFC2616Date(dateStr string) (int64, error) {
    // RFC2616标准日期格式解析(自动处理UTC时区)
    t, err := time.Parse(time.RFC1123Z, dateStr)
    if err != nil {
        return 0, fmt.Errorf("invalid date format: %w", err)
    }
    return t.Unix(), nil
}

// HandleClientResponseError 处理HTTP响应错误并调整时钟偏移
func HandleClientResponseError(resp *http.Response) error {
    if resp.Header == nil {
        return fmt.Errorf("missing response headers")
    }
    serverDate := resp.Header.Get("Date")
    if serverDate == "" {
        return fmt.Errorf("no Date header in response")
    }

    serverUnix, err := ParseRFC2616Date(serverDate)
    if err != nil {
        return fmt.Errorf("failed to parse server date: %w", err)
    }

    clientUnix := GetUnixTimestamp()
    ClockSkewSeconds = serverUnix - clientUnix
    return nil
}

// GenerateSecMsGec 生成Sec-MS-GEC令牌值
func GenerateSecMsGec() string {
    // 获取当前UTC时间戳(含时钟偏移)
    currentUnix := GetUnixTimestamp()

    // 转换为Windows文件时间(秒)
    ticks := currentUnix + int64(WinEpoch)

    // 向下取整到最近的5分钟间隔
    ticks = int64(ticks / 300) * 300 // 等价于 ticks -= ticks%300 的整数安全实现

    // 转换为100纳秒单位
    ticks100ns := int64(float64(ticks) * SToNs / 100)

    // 构建待哈希字符串
    strToHash := fmt.Sprintf("%d%s", ticks100ns, TrustedClientToken)

    // 计算SHA256哈希并转大写
    hash := sha256.Sum256([]byte(strToHash))
    return strings.ToUpper(hex.EncodeToString(hash[:]))
}
